Określ, czy łańcuch znaków jest liczbą całkowitą w Javie [duplikat]

to pytanie ma już odpowiedzi tutaj : jaki jest najlepszy sposób na sprawdzenie, czy łańcuch znaków reprezentuje liczbę całkowitą w Javie? (41 odpowiedzi) Zamknięty 7 lat temu .

Próbuję ustalić, czy dany element w tablicy łańcuchów jest liczbą całkowitą, czy nie.

Jestem .split(" ")'w wyrażeniu infiksowym w postaci String, a następnie próbuję podzielić wynikową tablicę na dwie tablice; jedną dla liczb całkowitych, jedną dla operatorów, odrzucając nawiasy i inne różne elementy. Jaki byłby najlepszy sposób, aby to osiągnąć?

Myślałem, że uda mi się znaleźć Metoda czy coś, ale nie ma takiego szczęścia.

Author: Ben, 2011-03-26

9 answers

Najbardziej naiwnym sposobem byłoby iterację nad ciągiem znaków i upewnienie się, że wszystkie elementy są poprawnymi cyframi dla danego radix. Jest to tak wydajne, jak to tylko możliwe, ponieważ musisz spojrzeć na każdy element co najmniej raz. Przypuszczam, że moglibyśmy to mikro-zoptymalizować w oparciu o radix, ale pod każdym względem jest to tak dobre, jak można się spodziewać.

public static boolean isInteger(String s) {
    return isInteger(s,10);
}

public static boolean isInteger(String s, int radix) {
    if(s.isEmpty()) return false;
    for(int i = 0; i < s.length(); i++) {
        if(i == 0 && s.charAt(i) == '-') {
            if(s.length() == 1) return false;
            else continue;
        }
        if(Character.digit(s.charAt(i),radix) < 0) return false;
    }
    return true;
}

Alternatywnie, możesz polegać na bibliotece Java, aby to mieć. Nie jest oparty na wyjątkach i będzie łapał tylko o każdy warunek błędu, który możesz wymyślić. Będzie to trochę droższe (trzeba stworzyć obiekt skanera, którego w krytycznie ciasnej pętli nie chcesz robić. Ale generalnie nie powinno być zbyt dużo droższe, więc dla codziennych operacji powinno być dość niezawodne.

public static boolean isInteger(String s, int radix) {
    Scanner sc = new Scanner(s.trim());
    if(!sc.hasNextInt(radix)) return false;
    // we know it starts with a valid int, now make sure
    // there's nothing left!
    sc.nextInt(radix);
    return !sc.hasNext();
}

Jeśli najlepsze praktyki nie mają dla ciebie znaczenia, lub chcesz trollować faceta, który robi twoje recenzje kodu, wypróbuj to na rozmiar:

public static boolean isInteger(String s) {
    try { 
        Integer.parseInt(s); 
    } catch(NumberFormatException e) { 
        return false; 
    } catch(NullPointerException e) {
        return false;
    }
    // only got here if we didn't return false
    return true;
}
 344
Author: corsiKa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-26 16:53:55

Używanie wyrażenia regularnego jest lepsze.

str.matches("-?\\d+");


-?     --> negative sign, could have none or one
\\d+   --> one or more digits

Nie jest dobrze używać NumberFormatException tutaj, jeśli możesz użyć if-statement zamiast tego.


Jeśli nie chcesz rozpoczynać zera, możesz po prostu użyć wyrażenia regularnego w następujący sposób:

str.matches("-?(0|[1-9]\\d*)");
 263
Author: shuangwhywhy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-11 12:43:51

LUB możesz skorzystać z pomocy naszych dobrych przyjaciół z Apache Commons: StringUtils.isNumeric (String str)

 146
Author: Will Madison,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-05 07:12:03

Lub po prostu

mystring.matches("\\d+")

Choć zwróci true dla liczb większych niż int

 72
Author: claus437,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-12 10:08:11

Chcesz użyć liczby całkowitej .metoda parseInt (String).

try{
  int num = Integer.parseInt(str);
  // is an integer!
} catch (NumberFormatException e) {
  // not an integer!
}
 64
Author: Mike Lewis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-26 00:32:44

Jako alternatywne podejście do próby parsowania łańcucha i przechwytywania NumberFormatException, możesz użyć regex; np.

if (Pattern.compile("-?[0-9]+").matches(str)) {
    // its an integer
}

Prawdopodobnie będzie to szybsze, zwłaszcza jeśli wstępnie skompilujesz i ponownie użyjesz wyrażenia regularnego.

Jednak problem z tym podejściem polega na tym, że Integer.parseInt(str) również się nie powiedzie, jeśli str reprezentuje liczbę, która znajduje się poza zakresem prawnych wartości int. Chociaż możliwe jest wytworzenie wyrażenia regularnego, które pasuje Tylko do liczb całkowitych z zakresu Integer.MIN_INT do Integer.MAX_INT, nie jest to ładny widok. (A ja nie spróbuję ...)

Z drugiej strony ... dopuszczalne może być traktowanie "not an integer" i "integer too large" oddzielnie dla celów walidacji.
 14
Author: Stephen C,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-15 01:41:04

Możesz użyć Integer.parseInt(str) i złapać NumberFormatException jeśli łańcuch nie jest poprawną liczbą całkowitą ,w następujący sposób (jak wskazują wszystkie odpowiedzi):

static boolean isInt(String s)
{
 try
  { int i = Integer.parseInt(s); return true; }

 catch(NumberFormatException er)
  { return false; }
}

Należy jednak zauważyć, że jeśli obliczona liczba całkowita przepełnia się, ten sam wyjątek zostanie wyrzucony. Twoim celem było dowiedzieć się, czy to prawidłowa liczba całkowita. Tak więc bezpieczniej jest stworzyć własną metodę sprawdzania ważności:

static boolean isInt(String s)  // assuming integer is in decimal number system
{
 for(int a=0;a<s.length();a++)
 {
    if(a==0 && s.charAt(a) == '-') continue;
    if( !Character.isDigit(s.charAt(a)) ) return false;
 }
 return true;
}
 8
Author: Rushil Paul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-03 10:43:14

Możesz użyć Integer.parseInt() LUB Integer.valueOf(), Aby pobrać liczbę całkowitą z ciągu znaków i złapać wyjątek, jeśli nie jest to zmienna int. Chcesz mieć pewność, aby złapać {[2] } może rzucać.

Warto zauważyć, że valueOf () zwróci obiekt Integer, a nie prymitywny int.

 1
Author: Chad La Guardia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-26 01:39:46
public boolean isInt(String str){
    return (str.lastIndexOf("-") == 0 && !str.equals("-0")) ? str.substring(1).matches(
            "\\d+") : str.matches("\\d+");
}
 -1
Author: Titus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-18 19:49:19